#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>

int main() 
{
    struct sigaction sa;
    sa.sa_handler = SIG_IGN;  // 忽略 SIGCHLD
    sigaction(SIGCHLD, &sa, NULL);

    pid_t pid = fork();
    if (pid == 0) {
        // 子进程：执行后退出
        printf("Child process (PID: %d) exiting.\n", getpid());
        exit(0);
    } else if (pid > 0) {
        // 父进程：不调用 wait()，直接休眠
        sleep(5);
        printf("Parent process (PID: %d) exits.\n", getpid());
    }
    return 0;
}






















// #include <iostream>
// #include <signal.h>
// #include <unistd.h>
// #include <cstdlib>
// #include <sys/wait.h>

// void Say(int sig)
// {
//     std::cout << "father get a signal: " << sig <<std::endl;
// }

// int main()
// {
//     signal(SIGCHLD,Say);
//     pid_t id = fork();
//     if(id == 0)
//     {
//         std::cout << "I am child, exit" << std::endl;
//         sleep(3);
//         exit(3);
//     }

//     waitpid(id,nullptr,0);
//     std::cout<< "I am father, exit" <<std::endl;
//     return 0;
// }


// volatile int flag = 0;//防止编译器优化，时时将物理内存的数据拷贝至CPU寄存器

// void handler(int signum)
// {
//     std::cout << "更改全局变量，" << flag << "-> 1" << std::endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2,handler);

//     while(!flag);
//     std::cout<< "process quit normal!" << std::endl;
//     return 0;
// }





//当前正在处理的信号，会自动屏蔽该信号
// void handler(int signum)
// {
//     std::cout << "hello signal: " << signum << std::endl;
//     while(true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         for(int i = 31;i >= 1;i--)
//         {
//             if(sigismember(&pending,i))
//                 std::cout<< "1";
//             else
//                 std::cout<< "0";
//         }
//         std::cout << std::endl;
//         sleep(1);
//     }
//     exit(0);
// }

// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     act.sa_flags = 0;
//     sigaction(SIGINT,&act,&oact);//对2号信号进行自定义捕捉，该函数会将相同的信号设置为阻塞，防止丢失

//     while(true)
//     {
//         std::cout<< "hello world " << getpid() << std::endl;
//         sleep(1);
//     }

//     return 0;
// }